package com.test33_反射;

import org.junit.Test;

/**
 * 反射与工厂设计模式
 */
public class Demo03_Factory {

    /**
     * 使用传统工厂设计模式
     */
    @Test
    public void test1() {
        IBook3 book = BookFactory.getInstance("math");
        book.read();
    }

    /**
     * 使用动态工厂设计模式
     */
    @Test
    public void test2() {
        IBook3 book = BookFactory2.getInstance("com.test25_反射.ProgramBook");
        book.read();
    }
}

interface IBook3 {
    public void read();
}

class MathBook implements IBook3 {
    @Override
    public void read() {
        System.out.println("【MathBook】认真学习大学数学课程（线性代数、概率统计、离散数学）。");
    }
}

class ProgramBook implements IBook3 {
    @Override
    public void read() {
        System.out.println("【ProgramBook】认真学习李兴华老师出版的《Java从入门到项目实战》");
    }
}

/**
 * 传统工厂设计模式
 */
class BookFactory {
    private BookFactory() {
    }

    public static IBook3 getInstance(String className) {
        if ("math".equalsIgnoreCase(className)) {
            return new MathBook();
        } else if ("program".equalsIgnoreCase(className)) {
            return new ProgramBook();
        } else {
            return null;
        }
    }
}

/**
 * 动态工厂设计模式
 */
class BookFactory2 {
    private BookFactory2() {
    }

    public static IBook3 getInstance(String className) {    // 必须传递类的完整名称
        try {
            Object obj = Class.forName(className).newInstance();
            if (obj instanceof IBook3) {
                return (IBook3) obj;    // 强制向下转型
            }
        } catch (Exception e) {
        }
        return null;
    }
}
